import greenfoot.*;
import java.lang.Math;
import java.util.List;

/**
 * Un soldado.
 * Solo son efectivos contra otros soldados. Son las únicas unidades que pueden capturar edificios.
 * 
 * @author Mario Alberto Valencia Valero
 */
public class Soldado extends Unidad
{
    private int turnosParaDisparar = 0;
    private GreenfootSound sonidoDisparo,
                   sonidoMuerte;
        
    /**
     * Constructor
     * @param col  color de la unidad
     * @param humano  es controlado por el jugador?
     */
    public Soldado(Color col, boolean humano)
    {
        super(col, humano);
        setImage("soldado_"+color.name()+".gif");
        getImage().scale( (int)(getImage().getWidth()*.8), (int)(getImage().getHeight()*.8) );
        vida = 2;
        velocidad = 3;
        sonidoDisparo = new GreenfootSound("machinegun.mp3");
        sonidoMuerte = new GreenfootSound("bulletbody.wav");
    }
    
    /**
     * Actuar.
     */
    public void act() 
    {
        super.act();
        if( turnosParaDisparar > 0 ) turnosParaDisparar--;
        if(!jugador)
        {
            for(Edificio e: (List<Edificio>)getWorld().getObjects(Edificio.class))
            {
                if(e.col==Unidad.Color.ROJO)
                {
                    nuevaCaptura(e);
                }
            }
        }
    }
    
    /**
     * Checa si una unidad está en el rango de disparo.
     * @param u  unidad enemiga
     * @return true si la unidad está en rango, si no, false
     */
    protected boolean enRango( Unidad u ){
        return distancia(u) < 200;
    }
        
    /**
     * Atacar a la unidad objetivo.
     */
    protected void atacar(){
        apuntar();
        if( turnosParaDisparar == 0 ) {
            turnosParaDisparar = 2;
            Disparo d = new Disparo();
            getWorld().addObject( d, getX(), getY() );
            d.setRotation( getRotation()+7 );
            d.move(20);
            disparar();
            //ImpactoBala ib1 = new ImpactoBala();
            //getWorld().addObject( ib1, objetivo.getX()+Greenfoot.getRandomNumber(10), objetivo.getY()+Greenfoot.getRandomNumber(10) );
            sonidoDisparo.play();
            //objetivo.bajarVida(1);
        }
    }
    
    /**
     * Iniciar nueva captura de edificio.
     * @param e  edificio a capturar
     */
    public void nuevaCaptura(Edificio e)
    {
        acc = Unidad.Accion.CAPTURAR;
        objx = e.getX(); objy = e.getY();
    }
    
    /**
     * Muere.
     */
    protected void muere(){
        sonidoMuerte.play();
    }
}

